package com.kazares.mail;

import java.io.File;
import java.util.Properties;
import java.util.Vector;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

/**
 *
 * @author acazares - Alejandro Cazares Diaz
 */
public class Mail {
    Vector<String> mailTo;
    Multipart mp;
    String titulo;
    Session session;

    /**
     * Constructor de clase
     *
     * @param titulo Titulo del correo electrónico
     */
    public Mail(String titulo) {
        this.titulo = titulo;
        mp = new MimeMultipart();
        mailTo = new Vector<String>();

        //inicialización de configuraciones
        Properties props = new Properties();
        props.setProperty("mail.smtp.host", MailProperties.MAIL_SMTP_HOST);
        props.setProperty("mail.smtp.starttls.enable", MailProperties.MAIL_SMTP_STARTTLS_ENABLE);
        props.setProperty("mail.smtp.port", MailProperties.MAIL_SMTP_PORT);
        props.setProperty("mail.smtp.user", MailProperties.MAIL_SMTP_USER);
        props.setProperty("mail.smtp.auth", MailProperties.MAIL_SMTP_AUTH);
        session = Session.getDefaultInstance(props);
    }

    /**
     * Agrega un correo electrónico a la lista de destinatarios
     *
     * @param mailTo correo electrónico del destinatario
     */
    public void addMailTo(String mailTo) {
        this.mailTo.add(mailTo);
    }

    /**
     * Agrega contenido html al cuerpo de mensaje del correo electrónico
     *
     * @param html
     * @throws MessagingException
     */
    public void addHtml(String html) throws MessagingException {
        MimeBodyPart bodyPart = new MimeBodyPart();
        bodyPart.setText(html, "utf-8", "html");
        mp.addBodyPart(bodyPart);
    }

    /**
     * Agrega texto plano al cuerpo de mensaje del correo electrónico
     *
     * @param html
     * @throws MessagingException
     */
    public void addText(String text) throws MessagingException {
        MimeBodyPart bodyPart = new MimeBodyPart();
        bodyPart.setText(text, "utf-8", "html");
        mp.addBodyPart(bodyPart);
    }

    /**
     * Adjunta un archivo al contenido del correo electrónico
     *
     * @param html
     * @throws MessagingException
     */
    public void addFile(String pathFile) throws MessagingException {
        File f = new File(pathFile);
        if (f.exists()) {
            MimeBodyPart msgPart = new MimeBodyPart();

            FileDataSource fds = new FileDataSource(pathFile);
            msgPart.setDataHandler(new DataHandler(fds));
            msgPart.setFileName(fds.getName());

            mp.addBodyPart(msgPart);
        }else{
            System.out.println("El archivo adjunto no existe. PathFile: "+pathFile);
        }
    }

    /**
     * Método para enviar el correo electrónico
     */
    public void enviar() throws MessagingException {
        if (this.mailTo.size() > 0) {//sin destinatarios no enviar nada
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(MailProperties.MAIL_SMTP_USER));
            message.setSubject(this.titulo);
            //incluir todos los destinatarios
            for (String destinatario : this.mailTo) {
                message.addRecipient(Message.RecipientType.TO,
                        new InternetAddress(destinatario));
            }
            //incluir todo el contenido (cuerpo del mensaje)
            message.setContent(mp);

            // Enviamos el correo
            Transport t = session.getTransport("smtp");
            t.connect(MailProperties.MAIL_SMTP_USER, MailProperties.MAIL_SMTP_PASS);
            t.sendMessage(message, message.getAllRecipients());
            t.close();
        }
    }

    
    public static void main(String[] args) {/* for test
        Mail email = new Mail("Quinta prueba completa");
        try {
            email.addMailTo("alejandrocazaresdiaz@gmail.com");
            email.addMailTo("nox_gdl@hotmail.com");
            email.addText("Prueba con texto plano, html, adjuntos y multiples destinatarios");
            email.addHtml("<br/><span style='color:green;'>Prueba exitosa</span>");
            email.addFile(System.getProperty("user.dir") + "/web/recursos/imagenes/usuario.jpg");
            email.addFile(System.getProperty("user.dir") + "/web/recursos/imagenes/404page.jpg");
            email.enviar();
        } catch (Exception e) {
            System.err.println("Error al enviar un correo electrónico: " + e);
        }
        
        //*/
    }
}
